#pragma once

#include "para.h"
#include "mol_sys.h"
#include "atom.h"
#include "force.h"
#include "corrections.h"
#include "physical_properties.h"
#include "output.h"
#include<vector>
#include<random>


/**************************************************************************Initialization**************************************************************************/

/*************************Classic*************************/
void initialize_positions(vector<Atom>& mol);
void initialize_velocities(vector<Atom>& mol);
void initialize(vector<Atom>& mol);

/*************************PIMD*************************/
void initialize_PIMD(vector<vector<Atom>>& mirror);




/**************************************************************************Evolving**************************************************************************/


/*************************Classic*************************/
void Verlet_halfstep1(std::vector<Atom>& mol);
void Verlet_halfstep2(std::vector<Atom>& mol);
void Save_Data(std::vector<Atom>& mol, int step, double temperature, double Ep, double Ek, double virial, double conf_pressure);
void NVT_Step(std::vector<Atom>& mol);
void NVE_Step(std::vector<Atom>& mol);
void NPT_Step(std::vector<Atom>& mol);


/*************************PIMD*************************/
void Verlet_halfstep1_PIMD_staging();
void Verlet_halfstep2_PIMD_staging();
void Save_Data_PIMD(int step, double Ep, double Ek, double Espr, double hamiltonion, double temperature);
void NVE_Step_PIMD();
void NVT_Step_PIMD();
void NPT_Step_PIMD();

void Verlet_velocity_PIMD_staging(const double dt);
void Verlet_coordinate_PIMD_staging(const double dt);

/************************************************************************************************************************************************************/
void Evolve();
